<?php

require_once( ORM_DIR.'/extractors/Extractor.php' );

class ObjectReference implements Extractor {
	
	const MODIFY_LEFT = 0;
	const MODIFY_RIGHT = 1;
	
	private $_rightObjectDescriptor;
	
	private $_leftFieldName;
	private $_rightFieldName;
	private $_rightRestrictions;
	
	private $_modificationType;
	
	public function __construct( $leftFieldName, & $rightObjectDescriptor, $rightFieldName, $rightRestrictions = array(), $modificationType = self::MODIFY_LEFT ) {
		
		$this->_leftFieldName = $leftFieldName;
		
		$this->_rightFieldName = $rightFieldName;
		$this->_rightObjectDescriptor =& $rightObjectDescriptor;
		$this->_rightRestrictions = $rightRestrictions;
		
		$this->_modificationType = $modificationType;
	}

	public function & get( & $storage, array & $fields ) {		
		
		// Устанавливаем ограничения на запись, с которой работаем
		$this->_rightRestrictions[ $this->_rightFieldName ] = $fields[ $this->_leftFieldName ];
		
		// Выбираем запись из хранилища
		return $storage->findByFields( $this->_rightObjectDescriptor, $this->_rightRestrictions );
	}
	
	public function set( & $storage, array & $fields, $value ) {
		
		// Получаем массив полей объекта на правом конце связи
		$rightFields = $value->getFields();
		
		if ( $this->_modificationType == self::MODIFY_LEFT ) {
			// Сохраняем в левом конце связи значение, соответствующее полю правого конца
			$fields[ $this->_leftFieldName ] = $rightFields[ $this->_rightFieldName ];
		} else if ( $this->_modificationType == self::MODIFY_RIGHT ) {
			// Сохраняем в правом конце связи значение, соответствующее полю левого конца
			$rightFields[ $this->_rightFieldName ] = $fields[ $this->_leftFieldName ];
		}
	}
}

?>